﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
//using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SOMClustering
{
    public partial class ProgressWindow : Form
    {
        private String processName;
        public String ProcessName
        {
            get { return processName; }
            set
            {
                if (value == "CLUSTERING")
                {
                    processName = value;
                    textBox1.Visible = false;
                    progressBar1.Visible = false;
                    pictureBoxTnl.Visible = false;
                    textBoxClustering.Visible = true;
                    Text = "Кластеризация изображений";
                }
            }
        }

        public ProgressWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="max"></param>
        /// <param name="val"></param>
        /// <param name="msg"></param>
        /// <param name="bmp"></param>
        public void OnProgress(int max, int val, string msg, Bitmap bmp)
        {
            if (progressBar1.InvokeRequired)
            {
                progressBar1.Invoke(new OnProgressDelegate(OnProgress), new object[4] { max, val, msg, bmp });
            }
            else
            {
                pictureBoxTnl.Image = bmp;
                progressBar1.Maximum = max;
                progressBar1.Value = val;
                textBox1.Text = string.Format("Обработано изображение {0} из {1}: " + msg, val, max);
                if (max == val)
                {
                    buttonCancel.Enabled = true;
                    pictureBoxTnl.Image = null;
                    Text = "Загрузка изображений завершена";
                    textBox1.Text = string.Format("Обработано изображений: {0}", max);
                }
            }
        }

        public void OnClusteringProgress(int iteration, Boolean end, double error, double dError)
        {
            if (progressBar1.InvokeRequired)
            {
                progressBar1.Invoke(new OnClusteringProgress(OnClusteringProgress), 
                    new object[4] { iteration, end, error, dError });
            }
            else
            {
                //progressBar1.Maximum = maxIteration;
                //progressBar1.Value = iteration;
                textBoxClustering.Text = 
                    string.Format("Итерация {0}. \r\nТочность: {1}. \r\nИзменение точности: {2}", 
                    iteration, error, dError);
                if (end)
                {
                    buttonCancel.Enabled = true;
                    Text = "Кластеризация завершена";
                    textBoxClustering.Text = 
                        string.Format("Количество итераций в процессе кластеризации: {0} \r\nТочность: {1}", 
                        iteration, error);
                }
            }
        }

        //public void OnProgress(int max, int val, string msg)
        //{
        //    if (progressBar1.InvokeRequired)
        //    {
        //        progressBar1.Invoke(new OnProgressDelegate(OnProgress), new object[3] { max, val, msg });
        //    }
        //    else
        //    {
        //        progressBar1.Maximum = max;
        //        progressBar1.Value = val;
        //        this.Text = msg;
        //        if (max == val)
        //            this.Close();
        //    }
        //}

        private void ProgressWindow_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (buttonCancel.Enabled == false)
            {
                //e.Cancel = true;
                MessageBox.Show("Нельзя прервать процесс. Пожалуйста, дождитесь завершения операции", "Обработка продолжается");
            }
        }

        private void ProgressWindow_MouseEnter(object sender, EventArgs e)
        {
            //this.Opacity = 0.5;
        }

        private void ProgressWindow_MouseLeave(object sender, EventArgs e)
        {
            //this.Opacity = 1.0;
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            //
            Close();
        }
    }
}
